package Arraylist;

import java.util.*;

public class Exercise {
    public static void remove(String s1,String s2) {
        for (int i = 0; i < s1.length(); i++) {
            ArrayList<Character> arrayList = new ArrayList<>();
            char ch = s1.charAt(i);
            if (!s2.contains(ch + "")) {   //如果字符串二中没有这个字符，那么就往ArrayList里面放    *字符串的contains需要传入字符串类型
                arrayList.add(ch);
            }
            for (int j = 0; j < arrayList.size(); j++) {
                System.out.print(arrayList.get(j));
            }
        }
    }
    public static void main(String[] args) throws CloneNotSupportedException{
        remove("welcome to bit","come");//删除字符串一中出现在字符串二中的所有字符
        System.out.println(generate(4));//杨辉三角(给定一个非负整数，生成杨辉三角的numRows(numRows>1)行,在杨辉三角中，每个数是他左上方和右上方的和)
        List<List<Integer>> a1=subsets(new int[]{1,2,3}); //求三个数组成的数组中所有的集合
        System.out.println(a1);
    }
    public static List<List<Integer>> generate(int numRows) {     //List<List<Integer>>就相当于一个二维数组   [i][j]=[i-1][j-1]+[i-1][j]
        //二维数组第一个元素中的一维数组因为只有一个数，所以直接列出来
        List<List<Integer>> ret = new ArrayList<>();
        List<Integer> row = new ArrayList<>();
        row.add(1);
        ret.add(row);
        //接着从第二行开始，根据[i][j]=[i-1][j-1]+[i-1][j]这个规律进行赋值
        for (int i = 1; i < numRows; i++) {    //从第二行开始，一直到第numRows行结束
            List<Integer> curRow = new ArrayList<>();   //当前行  注意:这里不能直接用get的原因是因为没有i这个地方的空间，空间是add时开辟的
            List<Integer> prevRow = ret.get(i - 1);   //前一行(为了计算数据)  ，而前一行是已经开辟过空间的，所以可以直接获得
            curRow.add(1);  //首尾都是1
            for (int j = 1; j < i; j++) { //因为是在j==i的地方存放的最后一个1，所以只能在小于i的地方存放数据，又因为j=0处已经存放了1，所以可得范围(画图可得知)
                Integer val = prevRow.get(j) + prevRow.get(j - 1);
                curRow.add(val);
            }
            curRow.add(1);
            ret.add(curRow);
        }
        return ret;
    }

    public static List<List<Integer>> subsets(int[] nums) throws CloneNotSupportedException{
        List<List<Integer>> list=new ArrayList<>();
        list.add(new ArrayList<>());                     //空集

        List<Integer> list1=new ArrayList<>();           //单个数字组成的子集
        for (int i = 0; i < nums.length; i++) {
            List<Integer> list2=new ArrayList<>();
            list2.add(nums[i]);
            list.add(list2);
        }


        int i=0;
        while(i<nums.length) {
            int j=i+1;
            ArrayList<Integer> list2=new ArrayList<>();
            list2.add(nums[i]);        //先让list2中放入一个起始数，之后再往顺序表里面放他之后的数，组成一个只有两个元素的子集
            while(j< nums.length) {
                list2.add(nums[j]);
                ArrayList<Integer> list3=(ArrayList<Integer>)list2.clone();
                list.add(list3);
                list2.remove(1);
                j++;
            }
            i++;
        }

        if(nums.length<=2) {                //如果数组长度小于等于二，不需要再将所有数组成一个集合
            return list;
        }
        for (i = 0; i < nums.length; i++) {     //所有数组成一个集合
            list1.add(nums[i]);
        }
        list.add(list1);
        return list;
    }
}